package algo_annotations.params.param_component;

import algo_annotations.params.ParamsManager_a;
import algo_annotations.params.Params_a;
import commons.data.EchelleGeneralization;
import commons.params.param_component.AbstractParamComponent_table;
import algo_lignes_sites.params.Params_ls;
import java.util.ArrayList;
import javax.swing.JComponent;


public class ParamComponent_table_EchelleParticuliere extends AbstractParamComponent_table {

	public enum TYPE_OBJECT {SITE, SEGMENT};

	private TYPE_OBJECT typeObject;

	// Pour les Site/Anno, une colonne additionnelle pour modifier éventuellement la taille des anno, tout en gardant l'échelle
	//  choisie pour la taille du site
	public ParamComponent_table_EchelleParticuliere(String name, ParamsManager_a paramsManager, JComponent component, boolean bCanBeNull, TYPE_OBJECT typeObject) {
		super(name, paramsManager, component, bCanBeNull,
				typeObject==TYPE_OBJECT.SITE ? new String[] {"Nom zone", "Catégorie", "Echelle", "Fact. taille anno"} : new String[] {"Nom zone", "Catégorie", "Echelle"},
				typeObject==TYPE_OBJECT.SITE ? new String[] {"nomZone", "categorie", "echelle", "facteurTailleAnno"} : new String[] {"nomZone", "categorie", "echelle"},
				typeObject==TYPE_OBJECT.SITE ? new Class[] {String.class, String.class, String.class, String.class} : new Class[] {String.class, String.class, String.class});
		this.typeObject = typeObject;
	}


	// appelée à la fin par ParamsManager afin de constituer le Params
	// l'argument params permet de retrouver certains objets déjà lus, via leur nom
	//  (les zones et les catégories)
	public ArrayList<EchelleGeneralization> getVEchelleParticuliere(Params_a params) {
		ArrayList<EchelleGeneralization> vRGP = new ArrayList<EchelleGeneralization>();

		// RMQ :
		// La règle de généralisation principale (zone principale - échelle principale - filtres principaux)
		//  est ajoutée en début de vecteur par ParamsManager, juste avant l'appel à cette fonction.
		EchelleGeneralization rg;
		for (int numRow = 0; numRow <data.size() ; numRow++) {
			Object[] rowData = data.get(numRow);

			if (typeObject == TYPE_OBJECT.SITE)
				rg = new EchelleGeneralization(
					params.getZoneByName((String) rowData[0]),
					params.getCategorySiteByName((String) rowData[1]),
					Double.parseDouble((String) rowData[2]),
					Double.parseDouble((String) rowData[3])
					);
			else
				rg = new EchelleGeneralization(
					params.getZoneByName((String) rowData[0]),
					params.getCategorySegmentByName((String) rowData[1]),
					Double.parseDouble((String) rowData[2])
					);

			vRGP.add(rg);
		}
		return vRGP;
	}

	//**************************************************************************
	//**************************************************************************

	@Override
	public void makeStandardControls() {

		// Test si la table peut etre vide
		if (!bCanBeNull && bIsNull) {
			invalidateComponent("Il est obligatoire de déclarer des échelles particulières", true);
			return;
		}

		assert possibleValues[0] != null && possibleValues[1] != null;

		beginControls();

		// Parcourt des row
		for (int numRow = 0; numRow <data.size() ; numRow++) {

			//***** Nom de la zone *********************************************
			basicCheck (numRow, 0);

			//**** Categorie (site ou segment suivant les cas) *****************
			basicCheck (numRow, 1);

			//***** Echelle ****************************************************
			basicCheck_IntPos(numRow, 2);

			//***** Facteur correctif taille anno ******************************
//			if (typeObject==TYPE_OBJECT.SITE) {
//				if (basicCheck_Float(numRow, 3)) {
//					// Le facteur de correction de taille d'anno doit etre >0
//					double fact = Double.parseDouble((String)data.get(numRow)[3]);
//					if (fact<0 || fact>1)
//						addError(numRow, 3, "Doit être compris entre 0 et 1");
//				}
//			}
			// en fait, non, on peut vouloir grossir une anno : donc le facteur de correction doit être >=0, tout simplement
			if (typeObject==TYPE_OBJECT.SITE)
				basicCheck_FloatPos(numRow, 3);

		}

		finaliseControls();
	}

}
